/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2021-04-27     Administrator       the first version
 */
#ifndef APPLICATIONS_CONTROL_CONTROL_H_
#define APPLICATIONS_CONTROL_CONTROL_H_

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include <cJSON.h>

/***********************Pin**********************************/
#define PIN_NUM  8
#define PIN_IN_0 GET_PIN(H, 3)      //key0, 红外检测  KEY0
#define PIN_IN_1 GET_PIN(H, 2)      //key1, 门禁检测 KEY0
#define PIN_IN_2 GET_PIN(C, 13)     //key2, 红外检测 KEY0
#define PIN_IN_3 GET_PIN(E, 8)      //PE1, 红外检测引脚  KEY0

#define PIN_OUT_0 GET_PIN(B, 1)      //PE1, LED0
#define PIN_OUT_1 GET_PIN(B, 0)      //PE1, LED1
#define PIN_OUT_2 GET_PIN(E, 12)      //PE1, 红外检测引脚  KEY0
#define PIN_OUT_3 GET_PIN(E, 13)      //PE1, 红外检测引脚  KEY0
typedef struct CtlPin
{
    long pin;
    int mode;
    int status;
} CtlPin;
CtlPin ctl_pins[PIN_NUM]; // 引脚状态保存

/***********************Auto**********************************/
// 自动化控制
#define AUTO_NUM 4           // auto个数
#define AUTO_CONDITION_NUM 4 // 单个auto中condition个数
#define AUTO_RUN_NUM 4       // 单个auto中run个数
#define AUTO_LOGIC_AND 1     // 同时满足
#define AUTO_LOGIC_OR 2      // 满足一个条件

typedef struct AutoCondition {
    int pin_id; // 引脚
    int status; // 状态
    int enable; // 使能
} AutoCondition;

typedef struct AutoRun
{
    int pin_id; // 引脚
    int status; // 状态
    int enable; // 使能
} AutoRun;

typedef struct AutoList
{
    AutoCondition condition[AUTO_CONDITION_NUM]; // 条件 0x11: 第1输入脚输入1
    AutoRun run[AUTO_RUN_NUM];       // 动作 0x11: 第1输出脚输出1
    int logic;        // 逻辑 1: and 2: or
    int enable;       // 使能
} AutoList;
AutoList autos[AUTO_NUM]; // auto执行


void ctl_auto_check();
void ctl_auto_print();
void clt_auto_update(cJSON *msg);
void ctl_pin_init();
void ctl_pin_check();
void ctl_pin_upload();
int ctl_pin_get();


#endif /* APPLICATIONS_IO_DOOR_H_ */
